package cyx.example.ddd.domain.shared;

import java.time.Instant;
import java.util.UUID;

/**
 * 领域事件接口
 * 所有的领域事件都应该实现此接口
 * 
 * 注意：这是一个示例实现，在实际企业项目中，可能需要考虑：
 * 1. 事件版本管理
 * 2. 事件序列化/反序列化
 * 3. 事件元数据（如租户ID、用户ID等）
 * 4. 事件分类和优先级
 */
public interface DomainEvent {
    /**
     * 获取事件唯一标识
     */
    default String getEventId() {
        return UUID.randomUUID().toString();
    }

    /**
     * 获取事件发生时间
     */
    default Instant getOccurredOn() {
        return Instant.now();
    }

    /**
     * 获取事件版本
     * 用于事件升级和兼容性处理
     */
    default int getVersion() {
        return 1;
    }

    /**
     * 获取事件类型
     * 用于事件路由和处理
     */
    default String getEventType() {
        return this.getClass().getSimpleName();
    }
}